﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <type_traits>
//// 版本1：仅适⽤于可递增的类型（如 int）
//template<typename T>
////检测类型支不支持++x，如果支持调用第一个，如果不支持调用第二个
//auto foo(T x) -> decltype(++x, void()) {
//	std::cout << "foo(T): " << x << " (can be incremented)\n";
//} 
//// C++17 使⽤void_t优化上⾯的写法
//template<typename T>
//auto foo(T x) -> std::void_t<decltype(++x)> {
//	std::cout << "foo(T): " << x << " (can be incremented)\n";
//}
//
//// 版本2：回退版本
//void foo(...) {
//	std::cout << "foo(...): fallback (cannot increment)\n";
//} 
//int main() {
//	foo(42); // 调⽤版本1（int ⽀持 ++x）
//	foo(std::string("1111")); // 调⽤版本2（string 不⽀持 ++x）
//	return 0;
//}
// 对于整数类型启⽤此重载
template<typename T>
typename std::enable_if_t<std::is_integral_v<T>, T>
add_one(T t) {
	return t + 1;
} 
// 对于浮点类型启⽤此重载
template<typename T>
typename std::enable_if_t<std::is_floating_point_v<T>, T>
add_one(T t) {
	return t + 2.0;
} 
// 模板参数的检查
template<typename T,
	typename = std::enable_if_t<std::is_integral_v<T>>>
void process_integer(T value) {
	// 只接受整数类型
} 
int main() {
	std::cout << add_one(5) << "\n"; // 调⽤整数版本，输出6
	std::cout << add_one(3.14) << "\n"; // 调⽤浮点版本，输出4.14
	// add_one("hello"); // 编译错误，没有匹配的重载
	process_integer(1);
	// process_integer(1.1); // 编译错误，没有匹配的重载
	return 0;
}